# 三次样条插值的图示

import numpy as np  #载入数值计算的库
import matplotlib.pyplot as plt  #载入画图的库
import scipy.interpolate as spi  #载入科学计算的库

x=np.array([0,5,10,15])  #给定的四个点的横坐标
y=np.array([10,15,5,20])  #给定的四个点的纵坐标

xnew=np.linspace(0, 15, 151)  #需要插值的点的横坐标
f3=spi.interp1d(x,y,'cubic')  #调用一维插值函数
ynew=f3(xnew)  #计算需要插值的点的纵坐标

fig=plt.figure()  #创建一个图对象
ax=fig.add_subplot(111)  #创建一个轴对象
ax.plot(x,y,'o')  #画出四个点
ax.plot(xnew[0:51],ynew[0:51],'c-')  #画出第一段样条曲线，颜色 c=cyan
ax.plot(xnew[51:101],ynew[51:101],'b-')  #画出第二段样条曲线
ax.plot(xnew[101:151],ynew[101:151],'g-')  #画出第三段样条曲线
ax.set_xlim([-2,17])  #设置横轴显示范围
ax.set_ylim([0,25])  #设置纵轴显示范围
ax.set_xticks([])  #设置横坐标刻度为空
ax.set_yticks([])  #设置纵坐标刻度为空

ax.annotate(r'$(x_0,y_0)$',xy=[-1,7.5])  #在指定位置标注字符
ax.annotate(r'$(x_1,y_1)$',xy=[5.5,15])
ax.annotate(r'$(x_2,y_2)$',xy=[9,3])
ax.annotate(r'$(x_3,y_3)$',xy=[13,21.5])
ax.annotate(r'$S_0(x)$',xy=[1.5,18],color='c')
ax.annotate(r'$S_1(x)$',xy=[7.4,10],color='b')
ax.annotate(r'$S_2(x)$',xy=[11.7,14],color='g')
ax.set_title('Spline interpolation')  #设置图的标题
fig.savefig('mme2024-example-7-4-c.png')  #保存图像
